<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <link rel="shortcut icon" type="image/x-icon" href="../favicon.ico"/>
    <title>Web 框架集成 jetbrick-template</title>

    <link href="../assets/css/application.min.css" rel="stylesheet" type="text/css"/>

    <!--[if lt IE 9]><script src="../assets/js/html5shiv.js"></script><![endif]-->
    <script type="text/javascript" src="../assets/js/application.min.js"></script>
</head>

<body>
<a href="https://github.com/subchen/jetbrick-template/" target="_blank">
    <img src="../assets/images/forkme_right_orange.png" alt="Fork me on GitHub" class="fork-me-on-github">
</a>

<div class="jb-topbar">
    <div class="container">
        <a href="http://subchen.github.io/"><img src="../assets/images/logo-mini.png"/></a>
        <!--
        <ul class="menubar">
            <li><a href="">commons</a></li>
            <li><a href="">webmvc</a></li>
            <li><a href="">template</a></li>
            <li><a href="">orm</a></li>
            <li><a href="">widget</a></li>
            <li><a href="">javadoc-chm</a></li>
        </ul>
        -->
        <div class="pull-right" style="color:#fff;line-height:40px;font-size:16px;padding-right:20px">QQ 交流圈：310491655</div>
    </div>
</div>

<div class="jb-banner">
    <div class="container">
        <a href="http://subchen.github.io/jetbrick-template/index.html">
            <img src="../assets/images/jetbrick-template-logo.png" class="pull-left" />
        </a>
        <ul class="description">
            <li>1. 全新一代 Java 模板引擎</li>
            <li>2. 具有高性能、高扩展性</li>
            <li>3. 完美替代 JSP, Velocity 等引擎模板</li>
        </ul>
        <a href="download/jetbrick-template-1.2.3.zip" class="download-button">
            <img src="../assets/images/download.png"/>
            <span>jetbrick-template-1.2.3.zip<br/>2014-03-10</span>
        </a>
    </div>
</div>

<div class="container">
    <div class="jb-section">
        <ul class="tabs">
            <li><a href="overview.html">简介</a></li>
            <li><a href="download.html">下载</a></li>
            <li><a href="userguide.html">开发指南</a></li>
            <li><a href="config.html">配置指南</a></li>
            <li><a href="syntax.html">语法指南</a></li>
            <li><a href="integrate.html" class="selected">Web 框架集成</a></li>
            <!--
            <li><a href="example.html">例子</a></li>
            -->
            <li><a href="faq.html">FAQ</a></li>
            <li><a href="about.html">关于</a></li>
        </ul>
    </div>
</div>

<div class="container">
    <div class="announcement">
        <a href="download.html#version">2014-03-10：jetbrick-template-1.2.3 正式版已发布，欢迎下载。</a>
    </div>
</div>

<div class="container">

    <style type="text/css">
        .affix-top {
          float: left;
          margin-top: 20px;
        }
        .affix {
          position: left;
          float: right;
          top: 20px;
          margin-top: 0 !important;
          z-index: 100;
        }
        .jb-nav-list-container {
            width: 220px !important;
            margin-top: 20px;
        }
        .markdown {
          margin-left: 260px; 
        }
    </style>
    <div class="jb-nav-list-container" data-spy="affix" data-offset-top="230">
        <ul class="jb-nav-list">
            <li><a href="#x1016944">1 简述</a></li>
            <li><a href="#x1336408494">2 Web 中的默认隐含对象</a></li>
            <li><a href="#x1694283446">3 JetEngine 自动加载方式</a></li>
            <li><a href="#x1896411413">4 各种集成方式介绍</a></li>
            <li><a href="#x1487897129">&nbsp&nbsp4.1 直接使用 HttpServlet</a></li>
            <li><a href="#x554032752">&nbsp&nbsp4.2 直接使用 Filter 模式</a></li>
            <li><a href="#x1633219041">&nbsp&nbsp4.3 Struts 2.x</a></li>
            <li><a href="#x941308089">&nbsp&nbsp4.4 Spring MVC</a></li>
            <li><a href="#x2108526772">&nbsp&nbsp4.5 JFinal</a></li>
            <li><a href="#x2439853">&nbsp&nbsp4.6 Nutz</a></li>
            <li><a href="#x2314405">&nbsp&nbsp4.7 Jodd</a></li>
        </ul>
    </div>

    <div class="markdown">

<!-- markdown body begin -->

    <h1><a name="x1016944"></a><span>1 简述</span></h1>
<p>jetbrick-template 除了作为普通的模板引擎嵌入在 Application 中外，大部分情况下还会和各种 WebMVC 框架整合作为前端的 View，来代替过时的 JSP 或者 Velocity。</p>
<p>目前已近集成了几种流行的 Web 框架：</p> 
<ul> 
 <li><a href="#HttpServlet">HttpServlet</a></li> 
 <li><a href="#Filter">Filter</a></li> 
 <li><a href="#Struts">Struts 2.x</a></li> 
 <li><a href="#SpringMVC">Spring MVC</a></li> 
 <li><a href="#JFinal">JFinal</a></li> 
 <li><a href="#Nutz">Nutz</a></li> 
 <li><a href="#Jodd">Jodd</a></li> 
</ul>
<p><a href="download.html#samples">点击这里下载各种集成方式的演示 demo</a></p>
<h1><a name="x1336408494"></a><span>2 Web 中的默认隐含对象</span></h1>
<p>当 jetbrick-template 被用作 Web 应用中时候，会自动引入下面的对象，这些对象在所有的模板中全局可访问。</p> 
<table> 
 <thead> 
  <tr> 
   <th>隐含对象 </th> 
   <th>类 型 </th> 
   <th>说 明 </th> 
  </tr> 
 </thead> 
 <tbody> 
  <tr> 
   <td>context </td> 
   <td>JetConext </td> 
   <td> </td> 
  </tr> 
  <tr> 
   <td>servletContext </td> 
   <td>ServletContext </td> 
   <td> </td> 
  </tr> 
  <tr> 
   <td>session </td> 
   <td>HttpSession </td> 
   <td> </td> 
  </tr> 
  <tr> 
   <td>request </td> 
   <td>HttpServletRequest </td> 
   <td> </td> 
  </tr> 
  <tr> 
   <td>response </td> 
   <td>HttpServletResponse </td> 
   <td> </td> 
  </tr> 
  <tr> 
   <td>applicationScope </td> 
   <td>Map&lt;String,Object&gt; </td> 
   <td>快捷访问 servletContext.getAttribute(name) </td> 
  </tr> 
  <tr> 
   <td>sessionScope </td> 
   <td>Map&lt;String,Object&gt; </td> 
   <td>快捷访问 session.getAttribute(name) </td> 
  </tr> 
  <tr> 
   <td>requestScope </td> 
   <td>Map&lt;String,Object&gt; </td> 
   <td>快捷访问 request.getAttribute(name) </td> 
  </tr> 
  <tr> 
   <td>parameter </td> 
   <td>Map&lt;String,String&gt; </td> 
   <td>快捷访问 request.getParameter(name) </td> 
  </tr> 
  <tr> 
   <td>parameterValues </td> 
   <td>Map&lt;String,String[]&gt; </td> 
   <td>快捷访问 request.getParameterValues(name) </td> 
  </tr> 
  <tr> 
   <td>ctxpath </td> 
   <td>String </td> 
   <td>快捷访问 request.getContextPath() </td> 
  </tr> 
  <tr> 
   <td>webroot </td> 
   <td>String </td> 
   <td>返回完整的webapp路径: <a href="http://127.0.0.1:8080/myapp">http://127.0.0.1:8080/myapp</a> </td> 
  </tr> 
 </tbody> 
</table>
<p><strong>下面的例子演示了如何使用这些隐含变量：</strong></p>
<p>模板如下：</p> 
<script type="syntaxhighlighter" class="brush: text"><![CDATA[
request.requestURI == ${request.requestURI}
request.getParameter("name") == ${parameter.name}
request.getAttribute("items") == ${requestScope.items}
session.getAttribute("user") == ${sessionScope.user}
]]></script>
<p>特别需要说明的一点是：模板中使用或者声明的全局变量不光会从 <code>JetConext context</code> 中获取，在 Web 应用中，还会从 <code>requestScope</code>，<code>sessionScope</code>，<code>applicationScope</code> 中查找对应的内容。</p>
<p>默认的查顺序如下：</p> 
<ol> 
 <li>context</li> 
 <li>requestScope</li> 
 <li>sessionScope</li> 
 <li>applicationScope</li> 
</ol>
<p>也就是说，如果存在 <code>request.getAttribute(&quot;user&quot;)</code> 的情况下 <code>${user}</code> 等价于 <code>${requestScope.user}</code>。</p>
<p><a name="JetEngine"></a></p>
<h1><a name="x1694283446"></a><span>3 JetEngine 自动加载方式</span></h1>
<p>需要在 web.xml 中进行配置，下面两个配置项都是可选项。</p> 
<script type="syntaxhighlighter" class="brush: xml"><![CDATA[
<context-param>
  <param-name>jetbrick-template-config-location</param-name>
  <param-value>/WEB-INF/jetbrick-template.properties</param-value>
</context-param>

<listener>
  <listener-class>jetbrick.template.web.JetWebEngineLoader</listener-class>
</listener>
]]></script>
<p>如果没有配置 <code>jetbrick-template-config-location</code> 参数，那么配置文件默认从 classpath 根目录下面查找 jetbrick-template.properties。</p>
<p>如果没有配置 JetWebEngineLoader 启动监听器，那么 JetEngine 也会在模板第一次请求的时候自动初始化。配置成 Listener，可以在 Webapp 启动的时候马上进行初始化。</p>
<p><strong>注意：</strong></p> 
<ol> 
 <li><p>在 Web 集成模式中，采用以下的默认值：</p> <script type="syntaxhighlighter" class="brush: text"><![CDATA[
template.loader = jetbrick.template.web.WebResourceLoader
template.path = /
]]></script></li> 
 <li><p>对于 <code>WebResourceLoader</code> 的来说，<code>template.path</code> 的路径相对于 webapp 的根目录。</p> <script type="syntaxhighlighter" class="brush: text"><![CDATA[
/ == servletContext.getRealPath("/")
/WEB-INF/jetx == servletContext.getRealPath("/WEB-INF/jetx")
]]></script></li> 
 <li><p>jetbrick-template 内置和其他 Web 框架的集成方式都可以用这两个配置想进行全局初始化。</p></li> 
 <li><p>在 web 集成模式中，<code>JetEngine</code> 是单例的，可以通过 <code>JetWebEngineLoader.getJetEngine()</code> 获取。</p></li> 
</ol>
<h1><a name="x1896411413"></a><span>4 各种集成方式介绍</span></h1>
<p><a name="HttpServlet"></a></p>
<h2><a name="x1487897129"></a><span>4.1 直接使用 HttpServlet</span></h2>
<p>jetbrick-template 可以直接作为 HttpServlet 使用。需要在 web.xml 中作如下配置。</p> 
<script type="syntaxhighlighter" class="brush: xml"><![CDATA[
<servlet>
  <servlet-name>jetbrick-template</servlet-name>
  <servlet-class>jetbrick.template.web.servlet.JetTemplateServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>jetbrick-template</servlet-name>
  <url-pattern>*.jetx</url-pattern>
</servlet-mapping>
]]></script>
<p>最简单，也是最直接的方式。打开浏览器访问 <a href="http://127.0.0.1:8080/index.jetx">http://127.0.0.1:8080/index.jetx</a> 看看效果吧。</p>
<p>具体例子代码参考： <a href="https://github.com/subchen/jetbrick-template-webmvc-samples/">https://github.com/subchen/jetbrick-template-webmvc-samples/</a></p>
<p><a name="Filter"></a></p>
<h2><a name="x554032752"></a><span>4.2 直接使用 Filter 模式</span></h2>
<p>jetbrick-template 可以直接作为 Filter 使用。需要在 web.xml 中作如下配置。</p> 
<script type="syntaxhighlighter" class="brush: xml"><![CDATA[
<filter>
  <filter-name>jetbrick-template</filter-name>
  <filter-class>jetbrick.template.web.servlet.JetTemplateFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>jetbrick-template</filter-name>
  <url-pattern>*.jetx</url-pattern>
</filter-mapping>
]]></script>
<p><a name="Struts"></a></p>
<h2><a name="x1633219041"></a><span>4.3 Struts 2.x</span></h2>
<p>jetbrick-template 可以和 Struts 2.x 进行集成。</p>
<p>首先需要对 Struts 进行如下配置（<code>struts.xml</code>），这个配置是告诉 Struts 使用 <code>jetbrick.template.web.struts.JetTemplateResult</code> 这个类来处理采用 jetbrick-template 格式的模板：</p> 
<script type="syntaxhighlighter" class="brush: xml"><![CDATA[
<result-types>
  <result-type name="jetx" class="jetbrick.template.web.struts.JetTemplateResult" />
</result-types>
]]></script>
<p>接下来配置你的 action 如下：</p> 
<script type="syntaxhighlighter" class="brush: xml"><![CDATA[
<action name="index" class="jetbrick.template.samples.struts.action.IndexAction">
  <result type="jetx">/index.jetx</result>
</action>
]]></script>
<p>打开浏览器访问 <a href="http://127.0.0.1:8080/index.do">http://127.0.0.1:8080/index.do</a> 看看效果吧。</p>
<p>具体例子代码参考： <a href="https://github.com/subchen/jetbrick-template-webmvc-samples/">https://github.com/subchen/jetbrick-template-webmvc-samples/</a></p>
<p><a name="SpringMVC"></a></p>
<h2><a name="x941308089"></a><span>4.4 Spring MVC</span></h2>
<p>jetbrick-template 可以和 Spring MVC 进行集成。</p>
<p>配置方式如下：</p> 
<script type="syntaxhighlighter" class="brush: xml"><![CDATA[
<bean id="viewResolver" class="jetbrick.template.web.springmvc.JetTemplateViewResolver">
  <property name="suffix" value=".jetx" />
  <property name="contentType" value="text/html; charset=utf-8" />
  <property name="order" value="9" />
</bean>
]]></script>
<p>具体例子代码参考： <a href="https://github.com/subchen/jetbrick-template-webmvc-samples/">https://github.com/subchen/jetbrick-template-webmvc-samples/</a></p>
<p><a name="JFinal"></a></p>
<h2><a name="x2108526772"></a><span>4.5 JFinal</span></h2>
<p>jetbrick-template 可以和 JFinal 进行集成。</p> 
<ol> 
 <li><p>修改 JFinal 主配置文件</p> <script type="syntaxhighlighter" class="brush: java"><![CDATA[
public class JetxConfig extends JFinalConfig {
    @Override
    public void configConstant(Constants me) {
        me.setMainRenderFactory(new JetTemplateRenderFactory());
        ...
    }
    ...
}
]]></script></li> 
 <li><p>新建一个 Controller</p> <script type="syntaxhighlighter" class="brush: java"><![CDATA[
public class UsersController extends Controller {
    public void index() {
        setAttr("userlist", DaoUtils.getUserList());
        render("/users.jetx");
    }
}
]]></script></li> 
</ol>
<p>可以了，就这么简单!</p>
<p>具体例子代码参考： <a href="https://github.com/subchen/jetbrick-template-webmvc-samples/">https://github.com/subchen/jetbrick-template-webmvc-samples/</a></p>
<p><a name="Nutz"></a></p>
<h2><a name="x2439853"></a><span>4.6 Nutz</span></h2>
<p>感谢 wendal (<a href="mailto:wendal1985@gmail.com">wendal1985@gmail.com</a>) 提供相关代码。</p>
<p>View： <code>jetbrick.template.web.nutz.JetTemplateView</code><br />ViewMaker：<code>jetbrick.template.web.nutz.JetTemplateViewMaker</code></p> 
<ol> 
 <li><p>将视图工厂整合进应用中：</p><p>在主模块上，加：<code>@Views({JetTemplateViewMaker.class})</code> 注解</p> <script type="syntaxhighlighter" class="brush: java"><![CDATA[
@Views({JetTemplateViewMaker.class})
@...
public class MainModule {
}
]]></script></li> 
 <li><p>使用 jetx 视图：</p> <script type="syntaxhighlighter" class="brush: java"><![CDATA[
@At
@Ok(".jetx:/WEB-INF/html/user_info.jetx")
public String list(@Param("name") String name, HttpServletRequest request){
  if (name != null) return name;
  return "测试";
}
]]></script></li> 
 <li><p>模板中使用:</p> <script type="syntaxhighlighter" class="brush: text"><![CDATA[
#define(String obj)
${obj}
]]></script></li> 
 <li><p>获得输出：</p> <script type="syntaxhighlighter" class="brush: text"><![CDATA[
测试
]]></script></li> 
</ol>
<p>具体例子代码参考： <a href="https://github.com/subchen/jetbrick-template-webmvc-samples/">https://github.com/subchen/jetbrick-template-webmvc-samples/</a></p>
<p><a name="Jodd"></a></p>
<h2><a name="x2314405"></a><span>4.7 Jodd</span></h2> 
<ol> 
 <li><p>首先需要配置 Jodd 的配置文件：madvoc.props</p> <script type="syntaxhighlighter" class="brush: text"><![CDATA[
[jetbrick.template.web.jodd.JetTemplateResult]
contentType=text/html; charset=UTF-8

[automagicMadvocConfigurator]
includedEntries=jodd.*,jetbrick.template.web.jodd.*,yourapp.jodd.action.*
]]></script></li> 
 <li><p>Action 例子</p> <script type="syntaxhighlighter" class="brush: text"><![CDATA[
@MadvocAction
public class UsersAction {
    @Out
    Collection<UserInfo> userlist;

    @Action(extension = Action.NONE)
    public Object view() {
        userlist = DaoUtils.getUserList();
        return "jetx:/users.jetx";
    }
}
]]></script></li> 
 <li><p>jetx 例子</p> <script type="syntaxhighlighter" class="brush: html"><![CDATA[
<table border="1" width="600">
  <tr>
    <td>ID</td>
    <td>姓名</td>
    <td>邮箱</td>
    <td>书籍</td>
  </tr>
  #for(UserInfo user: userlist)
  <tr>
    <td>${user.id}</td>
    <td>${user.name}</td>
    <td>${user.email}</td>
    <td><a href="books?author=${user.id}">书籍列表</a></td>
  </tr>
  #end
</table>
]]></script></li> 
</ol>
<p>具体例子代码参考： <a href="https://github.com/subchen/jetbrick-template-webmvc-samples/">https://github.com/subchen/jetbrick-template-webmvc-samples/</a></p>

<!-- markdown body end -->

    </div>
</div>

<div class="container">
    <div class="jb-footer">
        Copyright 2010-2014 Guoqiang Chen. All rights reserved.
        <br/>subchen&#64;gmail.com, QQ 交流圈：310491655
    </div>
</div>

<style type="text/css">
#cnzz_stat_icon_1000210720 {
	display: none;
}
</style>
<script type="text/javascript">
var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");
document.write(unescape("%3Cspan id='cnzz_stat_icon_1000210720'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s22.cnzz.com/z_stat.php%3Fid%3D1000210720' type='text/javascript'%3E%3C/script%3E"));
</script>



</body>
</html>
